#ifndef SINGLEGAME_H
#define SINGLEGAME_H

#include <QtConcurrent/QtConcurrentRun>
#include <QFutureWatcher>

#include "board.h"

class SingleGame : public Board
{
    Q_OBJECT
public:
    explicit SingleGame(QWidget *parent = nullptr);
    ~SingleGame() {
        cancelComputerMove();
    }

    void startComputerMove();
    void cancelComputerMove();
    // 重写移动棋子函数
    virtual bool movePiece(int row, int col, int secondId);
    // 电脑走棋
    void computerMove();
    // 电脑获取想要移动的步骤
    void getBestStepOfComputerByRecursion();

    int minimaxByRecursion(int depth, bool isMaximizingPlayer, int alpha,
        int beta, ChessPieces pieces[PIECES_NUM]);

    // 设置阵营
    void setPlayerSide(int side);
    // 设置AI难度
    void setAIDifficulty(Difficulty level);
    // 重写界面展示函数
    virtual void showEvent(QShowEvent* event);
    // 局面评估函数
    int evaluateBoard(ChessPieces pieces[PIECES_NUM]) const;
    
    // 悔棋按钮
    QScopedPointer<QPushButton> retrackButton;
    // AI级别
    int level;
    // 第一次显示界面
    bool firstShow;
    // 保存最佳走法
    QSharedPointer<Step> m_bestStep;
    QFutureWatcher<void> m_taskWatcher;
    QFuture<void> m_future;
    QElapsedTimer m_searchTimer;
    int m_timeLimitMs;
    int m_currentBestEval = INT_MIN; // 当前最佳评估值
    QMutex m_bestStepMutex; // 保护共享数据的互斥锁
    QSharedPointer<Step> m_currentBestStep; // 用于保存搜索过程中的最佳步骤
signals:
private slots:
    void onRetrackButtonClicked();
    // 按钮禁用
    void buttonDisable();
    void buttonEnable();
};

#endif // SINGLEGAME_H
